winsafe\mf\com_interfaces/
imfmediasession.rs

1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::kernel::privs::*;
6use crate::mf::vts::*;
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10com_interface! { IMFMediaSession: "90377834-21d0-4dee-8214-ba2e3e6c1127";
11	/// [`IMFMediaSession`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nn-mfidl-imfmediasession)
12	/// COM interface.
13	///
14	/// Automatically calls
15	/// [`Release`](https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release)
16	/// when the object goes out of scope.
17	///
18	/// # Examples
19	///
20	/// ```no_run
21	/// use winsafe::{self as w, prelude::*};
22	///
23	/// let media_session = w::MFCreateMediaSession(None::<&w::IMFAttributes>)?;
24	/// # w::HrResult::Ok(())
25	/// ```
26}
27
28impl mf_IMFMediaEventGenerator for IMFMediaSession {}
29impl mf_IMFMediaSession for IMFMediaSession {}
30
31/// This trait is enabled with the `mf` feature, and provides methods for
32/// [`IMFMediaSession`](crate::IMFMediaSession).
33///
34/// Prefer importing this trait through the prelude:
35///
36/// ```no_run
37/// use winsafe::prelude::*;
38/// ```
39pub trait mf_IMFMediaSession: mf_IMFMediaEventGenerator {
40	fn_com_noparm! { ClearTopologies: IMFMediaSessionVT;
41		/// [`IMFMediaSession::ClearTopologies`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-cleartopologies)
42		/// method.
43	}
44
45	fn_com_noparm! { Close: IMFMediaSessionVT;
46		/// [`IMFMediaSession::Close`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-close)
47		/// method.
48	}
49
50	fn_com_interface_get! { GetClock: IMFMediaSessionVT => IMFClock;
51		/// [`IMFMediaSession::GetClock`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-getclock)
52		/// method.
53	}
54
55	/// [`IMFMediaSession::GetFullTopology`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-getfulltopology)
56	/// method.
57	#[must_use]
58	fn GetFullTopology(
59		&self,
60		flags: co::MFSESSION_GETFULLTOPOLOGY,
61		topo_id: u64,
62	) -> HrResult<IMFTopology> {
63		let mut queried = unsafe { IMFTopology::null() };
64		ok_to_hrresult(unsafe {
65			(vt::<IMFMediaSessionVT>(self).GetFullTopology)(
66				self.ptr(),
67				flags.raw(),
68				topo_id,
69				queried.as_mut(),
70			)
71		})
72		.map(|_| queried)
73	}
74
75	/// [`IMFMediaSession::GetSessionCapabilities`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-getsessioncapabilities)
76	/// method.
77	#[must_use]
78	fn GetSessionCapabilities(&self) -> HrResult<co::MFSESSIONCAP> {
79		let mut caps = co::MFSESSIONCAP::default();
80		ok_to_hrresult(unsafe {
81			(vt::<IMFMediaSessionVT>(self).GetSessionCapabilities)(self.ptr(), caps.as_mut())
82		})
83		.map(|_| caps)
84	}
85
86	fn_com_noparm! { Pause: IMFMediaSessionVT;
87		/// [`IMFMediaSession::Pause`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-pause)
88		/// method.
89	}
90
91	/// [`IMFMediaSession::SetTopology`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-settopology)
92	/// method.
93	fn SetTopology(
94		&self,
95		flags: co::MFSESSION_SETTOPOLOGY,
96		topology: &impl mf_IMFTopology,
97	) -> HrResult<()> {
98		ok_to_hrresult(unsafe {
99			(vt::<IMFMediaSessionVT>(self).SetTopology)(self.ptr(), flags.raw(), topology.ptr())
100		})
101	}
102
103	fn_com_noparm! { Shutdown: IMFMediaSessionVT;
104		/// [`IMFMediaSession::Shutdown`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-shutdown)
105		/// method.
106	}
107
108	/// [`IMFMediaSession::Start`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-start)
109	/// method.
110	///
111	/// # Examples
112	///
113	/// ```no_run
114	/// use winsafe::{self as w, prelude::*, co};
115	///
116	/// let session: w::IMFMediaSession; // initialized somewhere
117	/// # let session = unsafe { w::IMFMediaSession::null() };
118	///
119	/// session.Start(
120	///     co::MF_TIME_FORMAT::NULL,
121	///     &w::PropVariant::Empty,
122	/// )?;
123	/// # w::HrResult::Ok(())
124	/// ```
125	fn Start(&self, time_format: co::MF_TIME_FORMAT, start_position: &PropVariant) -> HrResult<()> {
126		ok_to_hrresult(unsafe {
127			(vt::<IMFMediaSessionVT>(self).Start)(
128				self.ptr(),
129				pcvoid(&time_format),
130				pcvoid(&start_position.to_raw()?),
131			)
132		})
133	}
134
135	fn_com_noparm! { Stop: IMFMediaSessionVT;
136		/// [`IMFMediaSession::Stop`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-stop)
137		/// method.
138	}
139}